/******************************************************************************
* File Name	: girouette.c
* Author : groupe 2 A1
* Date : 2011
* Description : commandes de la girouette
* Etat:  fini et testé
********************************************************************************/


#include "girouette.h"


//fonction d'initialiser girouette
void init_girouette(){

	//Configuration de l'interruption correspondant au passage sur l'index de la girouette

	//On configure le port correspondant à l'index de la girouette en input floating
	Port_IO_Init_Input(GPIOA, 5);

	//On configure une interruption extérieure sur l'AFIO
	AFIO->EXTICR[2] &= ~(0x1 << AFIO_EXT9_SHIFT);

	//On fait le lien avec le Handler EXTI9_5_IRQHandler, implémenté dans bateau.c
	NVIC->ISER[EXTI9_5_BIT_INDEX]|= (0x1 << EXTI9_5_BIT_SHIFT);

	//On indique la priorité de cette interruption
	NVIC->IPR[EXTI9_5_VECT_INDEX] |= (0x1 << EXTI9_5_VECT_SHIFT);

	//Enfin on indique sur quelles broches on veut surveiller interruptions et évènements
	EXTI->IMR = (0x1 << 5);			   
	EXTI->RTSR |= (0x1 << 5);   





	//Configuration du timer pour le comptage de l'angle girouette
	(RCC->APB1ENR)|= RCC_TIM3EN;
	//On configure les ports 6 et 7 du GPIOA (respectivement CHA et CHB de la girouette) en input floating
	Port_IO_Init_Input(GPIOA, 6); 
	Port_IO_Init_Input(GPIOA, 7); 

	//Configuration des capture/compare 1 & 2
	//On commence par remettre à 0 les champs CC1S et CC2S (soient les bits 0 et 1, 8 et 9)
	//TIM3->CCMR1 &= ~(0x1 << TIM_CC1S_SHIFT);
	//On met les champs CC1S et CC2S à "01" car IC1 est relié à TI1 et IC2 est relié à TI2
	//TIM3->CCMR1|= TIM_CC1S_IS_INPUT_TI1; 

	//TIM3->CCMR1 &= ~(0x1 << TIM_CC2S_SHIFT);	
	//TIM3->CCMR1|= TIM_CC2S_IS_INPUT_TI2;  
	//Etat actuel connu du registre CCMR1: xxxx xx01 xxxx xx01


	//Configuration des capture/compare 1 & 2 en polarité non inversée, la capture est faite sur front montant
	//Pour cela on doit mettre les bits CC1P et CC2P du registre CCER à 0
	//TIM3->CCER &= ~(0x1 << 1);
	//TIM3->CCER &= ~(0x1 << 5);
	//Etat actuel connu du registre CCER: xxxx xxxx xx0x xx0x

	 
	//On remet à 0 le champ SMS (soit les bits 0, 1 et 2)
	TIM3->SMCR &= ~(0x7 << TIM_SMS_SHIFT);
	//On met les bits SMS à "011" pour compter les fronts montants et descendants de TI1 et TI2 
	//(par conséquent il faudra diviser par 4 pour avoir un angle correct)
	TIM3->SMCR |= TIM_SMS_IS_ENCODER_3;
	//Etat actuel connu du registre SMCR: xxxx xxxx xxxx x011 


	//On met 4 fois le nombre de degrés d'un tour de disque car le compteur est incrémenté 4 fois pour un seul degré réel
	TIM3->ARR = 360	* 4 - 1;
	TIM3->PSC = 0;
	TIM3->CNT = 0;


	//Il faut déclencher le comptage, donc mettre le bit CEN du registre CR1 à 1
	TIM3->CR1 |= TIM_CEN;

}


//fonction qui renvoie l'angle de la girouette
float trouver_angle_girouette(){
	return TIM3->CNT/4;
}